derive マクロを利用する上で注意すべきこと
from 項目28:分別をもってマクロを使おう
derive マクロ は入力 トークン を置き換えるのではなく、生成されたコードを追加する
つまり、データ構造の定義はそのまま
Decorator パターン のようなイメージ radish-miyazaki.icon
derive マクロは関連するヘルパ属性(helper attributes)を宣言できる
e.g. serde: https://github.com/serde-rs/serde/tree/master/serde_derive
Deserialize derive マクロでは、serde というヘルパ属性を持つ
この属性がデシリアライズ処理を制御するための メタデータ を提供する
code:rs
fn generate_value() -> String {
"unknown".to_string()
}
#derive(Debug, Deserialize)
struct MyData {
// デシリアライズ時に value が存在しなければ、generate_value の結果をセットする
#[serde(default = "generate_value")
value: String
}
入力トークン列をパースして、AST ノードにするための大半は syn クレートがやってくれる
e.g. syn::parse_macro_input!
アイテムのトークン列を proc_macro::TokenStream よりも簡単に扱える syn::DeriveInput に変換する
#Rust #Effective_Rust_―_Rustコードを改善し、エコシステムを最大限に活用するための35項目